package com.smartandroid.sa.tag.select;

import com.smartandroid.sa.tag.nodes.Node;

/**
 * Node visitor interface. Provide an implementing class to
 * {@link NodeTraversor} to iterate through nodes.
 * <p/>
 * This interface provides two methods, {@code head} and {@code tail}. The head
 * method is called when the node is first seen, and the tail method when all of
 * the node's children have been visited. As an example, head can be used to
 * create a start tag for a node, and tail to create the end tag.
 */
public interface NodeVisitor {
	/**
	 * Callback for when a node is first visited.
	 * 
	 * @param node
	 *            the node being visited.
	 * @param depth
	 *            the depth of the node, relative to the root node. E.g., the
	 *            root node has depth 0, and a child node of that will have
	 *            depth 1.
	 */
	public void head(Node node, int depth);

	/**
	 * Callback for when a node is last visited, after all of its descendants
	 * have been visited.
	 * 
	 * @param node
	 *            the node being visited.
	 * @param depth
	 *            the depth of the node, relative to the root node. E.g., the
	 *            root node has depth 0, and a child node of that will have
	 *            depth 1.
	 */
	public void tail(Node node, int depth);
}
